import { await } from "_@umijs_deps@3.5.19@@umijs/deps/compiled/signale";

async function fun (){       
    let result = await Math.random();
    console.log(result);
}
fun()  
/*
    0.6449111329837967
        Promise {<fulfilled>: undefined}
        [[Prototype]]: Promise
        [[PromiseState]]: "fulfilled"
        [[PromiseResult]]: undefined
    示例为 基本语法 
    函数执行 返回了一个promise对象 
*/ 


// async 表示定义的函数是异步的 定义的async函数返回值是个promise对象  
// 可以使用then方法添加回调函数 
async function func1 (){
    return 123;
}
func1.then(val =>{
    console.log(val);    // 123 
})
/*
    若async 定义的函数 有返回值 return 123; 
    相当于Promise.resolve(123) 
    相反没有声明式的return 等于Promise.resolve()
*/



// await 就是说async wait简写 
// await 必须出现在async函数内部 不可单独使用 
// 函数中只要使用await 则当前函数必须使用async装饰 
function notAsync(){
    await Math.random();
}
notAsync()   // Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
/*
    await 后面可以跟任何的 js表达式  最主要的意图是用来等待  Promise对象状态 被resolved 
          如果await的是 promise对象会造成异步函数停止执行并且等待 promise 的解决,
          如果等的是正常的表达式则立即执行。 
*/
function sleep(second) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(' enough sleep~');
        }, second);
    })
}
function normalFunc() {
    console.log('normalFunc');
}
async function awaitDemo() {     // 代码由上到下执行的 
    await normalFunc();
    console.log('something, ~~');
    let result = await sleep(2000);
    console.log(result);        // 两秒之后会被打印出来
}
awaitDemo();
/*  
    normalFunc
    something, ~~
    Promise {<pending>}[[Prototype]]: Promise[[PromiseState]]: "fulfilled"[[PromiseResult]]: undefined
    enough sleep~
*/


// 示例  
// 在真实开发中，你有三个请求需要发生，第三个请求是依赖于第二个请求的解构第二个请求依赖于第一个请求的结果
// 我们仍然使用 setTimeout 来模拟异步请求
function sleep(second, param) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(param);
        }, second);
    })
}
async function test() {
    let result1 = await sleep(2000,  'req01');
	console.log(result1);
    let result2 = await sleep(1000,  'req02' + result1);
	console.log(result2);
    let result3 = await sleep(500,   'req03' + result2);
    console.log(result3);
}
test();
//  Promise {<pending>}[[Prototype]]: Promise[[PromiseState]]: "pending"[[PromiseResult]]: undefined
//  req01
//  req02req01
//  req03req02req01